//
// Created by Rory on 2020/10/20.
//
#define GENERATE_TEST_FUNC_SIGNATURE
#include "../common.h"

/**
 * All In One：括号匹配
 * @param str 要进行匹配检验的字符串数组
 * @param brackets 要进行匹配检验的括号。左括号在前，右括号在右，两者相邻
 * @param m 括号数组的二维长度
 * @return 匹配是否成功
 */
bool BracketCheck(char str[],char brackets[],int m){
    char stack[STACK_CAPACITY];//临时栈
    int stackTop = -1;

    char* strP = str;//指向str的数组
    int flag = 0;//当前字符是 1:左括号 2:右括号 0:非括号
    int index = -1;//当前字符（如果是括号）在brackets中的二维索引

    while (*strP != '\0'){
        //当前字符是否是括号
        for (index = 0; index < m; ++index) {
            if(brackets[index] == *strP) {
                flag = index%2 == 0 ? 1 : 2;//判断括号的左右
                break;
            }
        }

        if(flag == 1){//左括号入栈
            stack[++stackTop] = *strP;
        }else if(flag == 2){//右括号，匹配检验
            if (stackTop == -1){//判断栈是否空
                return false;//匹配失败，原因为缺失左括号（栈空)
            } else if(brackets[index-1] != stack[stackTop--]){ // 出栈 + 左右括号匹配检验
                return false;//匹配失败，原因是左右括号不匹配
            }
        }

        strP++;
        flag = 0;
    }

    //再次检验栈是否为空
    if (stackTop != -1) {
        return false;//匹配失败，原因为缺失右括号（栈空)
    }

    return true;
}

TestFunc(BracketCheck){
    char brackets[] = {'(',')','{','}','[',']'};
    bool result = BracketCheck("1[{134[ww({er})]]",brackets,6);
    printf("result:%d\n",result);
}

int main(){

    InvokeFunc(BracketCheck);
    return 0;
}
